package com.wh.wisdomsite.xbox.server.interceptor;

import com.alibaba.fastjson.JSON;
import com.wh.wisdomsite.xbox.common.XboxRequestContext;
import com.wh.wisdomsite.xbox.common.util.XboxUtils;
import com.wh.wisdomsite.xbox.core.ServiceDispatcher;
import com.wh.wisdomsite.xbox.core.interceptor.AbstractInterceptor;
import com.wh.wisdomsite.xbox.utils.Const;
import org.apache.commons.lang.StringUtils;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;


/***
 * 密钥拦截器
 * @Package com.wh.wisdomsite.xbox.server.interceptor
 * @author 谢泽鹏
 * @date 2016年11月07日 下午15:10
 * @Copyright 个人版权所有
 * @Company 贵州万华科技有限公司Copyright (c) 2016
 * @version V1.0
 */
public class MethodSecretInteceptor extends AbstractInterceptor {

    @Resource(name = "serviceDispatcher")
    private ServiceDispatcher serviceDispatcher;


    /**
     * 方法前拦截(调用服务之前)
     * @param xboxRequestContext
     */
    @Override
    public void beforeService(XboxRequestContext xboxRequestContext) {
        Map response = new HashMap();
        //获取所有参数
        Map<String, String> map = xboxRequestContext.getAllParams();
        //获取密钥AppKey
        String appKey = (serviceDispatcher.getSecurityManager().getAppSecretManager()).getSecret(xboxRequestContext.getAppKey());
        //验证密钥AppKey
        if(StringUtils.isEmpty(appKey))
            return;
        //判断是否验证通过
        String sign = map.get("sign");
        if(StringUtils.isEmpty(sign)){
            response.put("code", Const.MISSING_SIGNATURE);
            response.put("message", "签名丢失");
            xboxRequestContext.setXboxResponse(response);
            return;
        }
        //业务参数
        Map<String, String> para = new HashMap<String, String>();
        String bindObject = map.get("bindObject");
        if(StringUtils.isNotEmpty(bindObject)){
            para = JSON.parseObject(bindObject, HashMap.class);
        }
        //判断请求参数是否被更改
        String _sign = XboxUtils.sign(para, appKey);
        if(!_sign.equals(sign)){
            response.put("code", Const.INVALID_SIGNATURE);
            response.put("message", "签名失效");
            xboxRequestContext.setXboxResponse(response);
            return;
        }
    }


    /**
     * 方法后拦截(调用服务之后)
     * @param xboxRequestContext
     */
    @Override
    public void beforeResponse(XboxRequestContext xboxRequestContext) {

    }

    /**
     * 该方法返回true时才实施拦截，否则不拦截
     * @param xboxRequestContext
     * @return
     */
    @Override
    public boolean isMatch(XboxRequestContext xboxRequestContext) {
//        String method = xboxRequestContext.getMethod();
//        if(method.matches("[\\w.]*((hszsd.ra.getCode))")){
//            return true;
//        }
        return false;
    }

}
